<?php
// 应用公共文件
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
use think\facade\Log;
use Ip2Region;
/**
 * 成功返回的封装
 * @param array $data 返回的数据
 * @param string $msg  提示信息
 * @param int $code   业务状态码，默认为200
 * @return \think\Response
 */
function success(array $data = [], string $msg = '操作成功', int $code = 200)
{
    return json(['code' => $code, 'msg' => $msg, 'data' => $data]);
}

/**
 * 失败返回的封装
 * @param string $msg  提示信息
 * @param array $data  返回的数据
 * @param int $code   业务状态码，默认为500
 * @return \think\Response
 */
function fail(string $msg = '操作失败', array $data = [], int $code = 500)
{
    return json(['code' => $code, 'msg' => $msg, 'data' => $data]);
}
/**
 * 获取真实IP地址
 * @return string
 */
function getRealIp()
{
    $request = request();
    $headers = $request->header();

    if (!empty($headers['x-forwarded-for'])) {
        // 可能有多个IP，取第一个
        $ips = explode(',', $headers['x-forwarded-for']);
        return trim($ips[0]);
    }
    if (!empty($headers['x-real-ip'])) {
        return $headers['x-real-ip'];
    }
    return $request->ip();
}
function convertIP($IP)
{
    $region = new Ip2Region();
    $value = $region->simple($IP);
    return $value;
}

/**
 * 获取带有基础URL的完整路径
 * @param string $value 相对路径
 * @return string
 */
function getBaseUrl($value = '')
{
    $scheme = (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') ? 'https://' : 'http://';
    return $scheme . $_SERVER['HTTP_HOST'] . $value;
}
/**
 * 生成 JWT
 * @param array $data
 * @param int $days 有效天数
 * @return string
 */
function setJWT(array $data, int $days = 7): string
{
    $cfg    = config('jwt.');
    $secret = $cfg['secret'] ?? 'change-me';
    $alg    = $cfg['alg'] ?? 'HS256';
    $now    = time();
    $token  = [
        'iat'  => $now,
        'nbf'  => $now,
        'exp'  => $now + 86400 * $days,
        'data' => $data
    ];
    return JWT::encode($token, $secret, $alg);
}

/**
 * 解析 JWT
 * @param string $token
 * @return array|null
 */
function getJWT(string $token): ?array
{
    if ($token === '') {
        return null;
    }
    $cfg    = config('jwt.');
    $secret = $cfg['secret'] ?? 'change-me';
    $alg    = $cfg['alg'] ?? 'HS256';
    try {
        $decoded = JWT::decode($token, new Key($secret, $alg));
        return isset($decoded->data) ? (array)$decoded->data : [];
    } catch (\Throwable $e) {
        Log::error('JWT decode fail: ' . $e->getMessage());
        return null;
    }
}

/**
 * 从请求头获取 Bearer Token
 * @return string
 */
function getHeaderToken(): string
{
    $auth = request()->header('Authorization');
    if (!$auth || stripos($auth, 'Bearer ') !== 0) {
        return '';
    }
    return substr($auth, 7);
}